/*
 * このクラスは画面に表示させるオブジェクト
 * を作成させるためのクラスです
 * このクラス単体ではインスタンス（オブジェクト化、実体化）
 * はできず、このクラスをextendsさせて使うようにしています
 * 理由としてはこのゲームを作成していくうちにわかってきますが
 * コード表記がラクチンになります
 */
package and.roid.shooting2;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;

public abstract class Object {
	private Mesod ms = new Mesod();
	public float disp_w, disp_h;
	// オブジェクトの画像
	public Drawable img;
	// オブジェクトの中心座標
	public float cx, cy;
	// 向かおうとしている座標
	public float vx, vy;
	// オブジェクトの移動スピード
	public float spx, spy;
	// オブジェクトの大きさ
	public int imgw, imgh;
	// オブジェクトを消去させるための変数
	public boolean dead;

	public Object() {
	}

	public Object(float dw, float dh) {
		disp_w = dw;
		disp_h = dh;
	}

	// 初期設定
	public void Oint(Bitmap imgb, float x, float y, float sx, float sy, int w, int h) {
		img = new BitmapDrawable(imgb);
		cx = ms.setSizeX(disp_w, x);
		cy = ms.setSizeY(disp_h, y);
		spx = sx;
		spy = sy;
		imgw = w;
		imgh = h;
		dead = false;
	}

	// 画像表示
	public void ODraw(Canvas c) {
		/*
		 * 画像を表示させていいかどうかdead状態を調べて表示 cx,cyは中心座標のため、画像の中心にちゃんとcx,cyがくるように調整
		 */
		if (dead == false) {
			img.setBounds((int) (cx - imgw / 2), (int) (cy - imgh / 2), (int) (cx + imgw / 2),
					(int) (cy + imgh / 2));
			img.draw(c);
		}
	}

	/*
	 * このクラスに各オブジェクトに必要なメソッドを書いても いいのですが、どのオブジェクトにどのメソッドを使用して
	 * いるかなどの管理も大変なので、こういうメソッドを持って いますよ的なことだけかいておきます（abstract）
	 * 作ろうとしている弾クラスには、タップ座標はいらないので メソッドのオーバーライドで登録
	 */
	public abstract void OMove();

	public abstract void OMove(int x, int y);

	public abstract Rect OgetTapRect();

	/*
	 * オブジェクトによって調べたい範囲が違うので引数で指定して調べるように変更
	 */
	public boolean OsotoX(int ww) {
		return (cx - ww < 0 || cx + ww > disp_w);
	}

	public boolean OsotoY(int hh) {
		Log.d("Osoto", String.format("cy[%s] hh[%s] cy - hh[%s] cy - hh < 0[%s] cy + hh[%s] disp_h[%s] cy + hh > disp_h[%s]", 
				cy, hh, cy - hh, cy - hh < 0, cy + hh, disp_h, cy + hh > disp_h));
		return (cy - hh < 0 || cy + hh > disp_h);
	}

	public boolean Ogetdead() {
		return dead;
	}// 表示していいかどうかを返す
}
